REM >Director:Menus.Files.CDFS2
REM 1.00 Nick Craig-Wood 18Dec95
REM 1.01 Philip Ludlam 21Mar99
REM 1.02 Philip Ludlam 24Feb02
REM
REM This is as CDFS but it reads the text under the icon in order
REM to find out which drive it is operating from
REM
REM Install with
REM   DirectorFilter "CDFS" "CDFS Filer" "Dynamic:/Director:Menus.Files.CDFS" -icon IconBar -menu
REM
REM Extended the list of options on the menu and added support for CDLib (PL)
REM Fixed getting sprite name if the icon is indirected (RISC OS 4.24+)

ON ERROR: ON ERROR OFF: ERROR ERR,REPORT$+" at "+STR$ ERL

buffer_size%=1024
DIM buffer% buffer_size%
DIM block% 16
debug%=FALSE

SYS "OS_GetEnv" TO com%
com$=FNgetstring(255,com%)
drive%=INSTR(com$,"-drive")
IF drive%<>0 drive$=STR$(EVAL(MID$(com$,drive%+6)))

Menu=FNswi_number("Director_Menu")
EndMenu=FNswi_number("Director_EndMenu")
Option=FNswi_number("Director_Option")
Command=FNswi_number("Director_Command")
Dash=FNswi_number("Director_Dash")
REM OS_DynamicArea=FNswi_number("OS_DynamicArea")

IF drive%=0 THEN
  window%=VAL(FNread("Director$Window"))
  icon%=VAL(FNread("Director$Icon"))

  SYS "Wimp_Initialise",310,&4B534154,"Temp" TO ,handle%
  drive$=FNgeticontext(window%,icon%)
  SYS "Wimp_CloseDown",handle%,&4B534154

  IF LEFT$(drive$,1)=":" THEN drive$=MID$(drive$,2)
ENDIF

OSCLI("SetEval Director$CDDrive "+drive$)

SYS "Director_Menu","CDFS"

OSCLI"Set Director$Menu CDFS::"+drive$

SYS Menu,"<Director$Menu> -temp"
  SYS Option, "Dismount"
    SYS Command, "Filer_CloseDir CDFS::"+drive$+"|mCDFS:Dismount "+drive$+""
  SYS Option, "Eject"
    SYS Command, "CDFS:Eject "+drive$
  SYS Option, "Stop"
    SYS Command, "CDFS:Stop "+drive$
  SYS Option, "Playlist"
    SYS Command, "CDFS:PlayList "+drive$
  SYS Option, """Audiooptions"" -sub ""CD Audio"""
  SYS Option, "Configure -sub CDFSConfig"
SYS EndMenu

END

DEF FNread(a$)
  ?buffer%=13
  SYS "XOS_ReadVarVal",a$,buffer%,buffer_size%,0,3 TO ,,read%
  buffer%?read%=13
=$buffer%

DEF FNswi_number(name$)
  SYS "OS_SWINumberFromString",,name$ TO A%
=A%

DEF FNgeticontext(win%,icon%)
LOCAL q%,t$,flags%
 t$=""
 IF icon%>=0 THEN
  buffer%!0=win%
  buffer%!4=icon%
  SYS "XWimp_GetIconState",,buffer% TO ;f%

  IF debug% THEN
    SYS "OS_File",0,"Root:DirCDbuf",buffer%,buffer%,buffer%,buffer%+64
    SYS "OS_File",0,"Root:DirCDtxt"
    SYS "OS_File",0,"Root:DirCDval"
  ENDIF

  IF (f% AND 1)=1 THEN
    t$="0"
  ELSE
    flags%=buffer%!24
    IF (flags% AND (1<<0)) <>0 THEN
      IF (flags% AND (1<<8)) =0 THEN
        t$=FNgetstring(12,buffer%+28)
      ELSE
        SYS "Wimp_SendMessage",0,block%,-2,icon% TO ,,thandle%
        SYS "Wimp_TransferBlock",thandle%,buffer%!28,handle%,buffer%,256
        t$=FNgetstring(255,buffer%)
      ENDIF
    ENDIF
  ENDIF
ENDIF
=t$

REM This gets a control terminated string of maximum length l% from p%

DEF FNgetstring(l%,p%)
LOCAL a$
 a$=""
 WHILE ?p%>=32 AND l%>0
  a$+=CHR$(?p%)
  p%+=1
  l%-=1
 ENDWHILE
=a$

